<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
    // 改变this指向的方法  call apply  bind 

    //  call apply  bind   所有的函数均可以使用(函数的拓展方法)

    //  call apply   俗称借鸡生蛋   把函数借用过来执行一次

    // call(obj,arg1,arg2...argN)
    // 1. 调用函数, 在本次函数执行过程中,强制将this指call()的第一参数 (如果第一参数是null和undefined 不会改变this指向)
    // 2. 如果函数需要接收参数,如果函数需要接收参数,则从第二参数开始依次向后传

    // function fn(a,b){
    //     console.log(this,a,b);
    // }

    // fn(); // 普通调用  this -> window

    // 调用
    // fn.call()  // 调用函数 this -> window

    // this指向
    // fn.call(document); //  调用函数, 在本次函数执行过程中   this-> document
    // fn.call(1);     // new Number(1)
    // fn.call("100"); // new String("100")
    // fn.call(true);  // new Boolean(true)
    // fn.call(null);  // this -> window
    // fn.call(undefined);  // this -> window

    // 接收参数
    // fn.call(document,100,200);
    // fn.call(1,100,200);


    // apply(obj,[arg1,arg2...argN])
    // 1. 调用函数, 在本次函数执行过程中,强制将this指apply()的第一参数 (如果第一参数是null和undefined 不会改变this指向)
    // 2. 如果函数需要接收参数,需要先将参数依次放到数组中,再将数组作为第二参数传入

    function fn(a,b){
        console.log(this,a,b);
    }

    // 调用
    // fn.apply();

    // this指向
    // fn.apply(document); //  调用函数, 在本次函数执行过程中   this-> document
    // fn.apply(1);     // new Number(1)
    // fn.apply("100"); // new String("100")
    // fn.apply(true);  // new Boolean(true)
    // fn.apply(null);  // this -> window
    // fn.apply(undefined);  // this -> window

    // 接收参数
    fn.apply(document,[100,200]);


</script>
</html>